// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This file defines macros to handle the output of the shlib-symbols
// script (run without the -a switch).  These macros generate assembly
// code that should define symbols in a DSO such that the resultant DSO
// has the same ABI as the DSO input to shlib-symbols.

#define FUNCTION(NAME, SIZE) FUNCTION_1(global, NAME)
#define WEAK_FUNCTION(NAME, SIZE) FUNCTION_1(weak, NAME)

#define FUNCTION_1(BINDING, NAME)      \
  .pushsection.text, "ax", % progbits; \
  .BINDING NAME;                       \
  .type NAME, % function;              \
  NAME:                                \
  .space 1;                            \
  .popsection

#define OBJECT_1(SECTION, SECFLAGS, SECTYPE, BINDING, NAME, SIZE) \
  .pushsection SECTION, SECFLAGS, % SECTYPE;                      \
  .BINDING NAME;                                                  \
  .type NAME, % object;                                           \
  NAME:                                                           \
  .space SIZE;                                                    \
  .size NAME, SIZE;                                               \
  .popsection

#define RODATA_OBJECT(NAME, SIZE) OBJECT_1(.rodata, "a", progbits, global, NAME, SIZE)
#define DATA_OBJECT(NAME, SIZE) OBJECT_1(.data, "aw", progbits, global, NAME, SIZE)
#define WEAK_DATA_OBJECT(NAME, SIZE) OBJECT_1(.data, "aw", progbits, weak, NAME, SIZE)
#define BSS_OBJECT(NAME, SIZE) OBJECT_1(.bss, "aw", nobits, global, NAME, SIZE)

#define UNDEFINED_WEAK(NAME, SIZE) UNDEFINED_1(weak, NAME)
#define UNDEFINED(NAME, SIZE) UNDEFINED_1(globl, NAME)
#define UNDEFINED_1(BINDING, NAME)          \
  .pushsection.undefined, "aw", % progbits; \
  .BINDING NAME;                            \
  .dc.a NAME;                               \
  .popsection
